<?php

namespace EthTool;

use Elliptic\EC;
use kornrunner\Keccak;
use Web3p\EthereumTx\Transaction;

class Credential
{
    private $keyPair;

    public function __construct($keyPair)
    {
        $this->keyPair = $keyPair;
    }

    public function getPublicKey()
    {
        return $this->keyPair->getPublic()->encode('hex');
    }

    public function getPrivateKey()
    {
        return $this->keyPair->getPrivate()->toString(16, 2);
    }

    public function getAddress()
    {
        $pubkey = $this->getPublicKey();
        return "0x" . substr(Keccak::hash(substr(hex2bin($pubkey), 1), 256), 24);
    }

    public function signTransaction($raw)
    {
        $txreq = new Transaction($raw);
        $privateKey = $this->getPrivateKey();
        $signed = '0x' . $txreq->sign($privateKey);
        return $signed;
    }

    public static function new()
    {
        $ec = new EC('secp256k1');
        $keyPair = $ec->genKeyPair();
        return new self($keyPair);
    }

    public static function fromKey($privateKey)
    {
        $ec = new EC('secp256k1');
        $keyPair = $ec->keyFromPrivate($privateKey);
        return new self($keyPair);
    }

    public static function newWallet($pass, $dir)
    {
        $credential = self::new();
        $private = $credential->getPrivateKey();
        $wallet = KeyStore::save($private, $pass, $dir);
        return $wallet;
    }

    public static function fromWallet($pass, $wallet)
    {
        $private = KeyStore::load($pass, $wallet);
        return self::fromKey($private);
    }
}

?>